package com.itheima.tlias84.utils;

import com.alibaba.fastjson2.JSONObject;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import netscape.javascript.JSObject;

import java.util.Date;

/**
 * jwt  token 生成与验证（解析）
 */
public class JwtUtil {
    /**
     * 数字签名
     */
    private static final String SIG = "e8f91579-1c9b-4a76-82c5-f9580a7a45b2";
    private JwtUtil() {
    }
    /**
     * 生成token
     *
     * @param username payload-用户名
     * @param password payload-密码
     * @param minutes  token过期时间，以分钟为单位
     * @return token
     */
    public static String generateJwt(String username, String password, long minutes) {
        //1、构建Jwt的生成对象
        //2、指定header（一般省略）
        //3、放置payload，以及过期时间和生效时间
        //4、指定数字签名
        /*第一个参数：数字签名(需要自己生成)
        第二个参数：加密签名算法，新版需要保证一定强度*/
        //5、生成token
        /*立即生效、1min后失效*/
        Date now = new Date();
        String token = Jwts.builder()
                .claim("username", username).claim("password", password)
                .issuedAt(now).expiration(new Date(now.getTime() + 1000 * 60 * minutes))
                .signWith(Keys.hmacShaKeyFor(SIG.getBytes()), Jwts.SIG.HS256)
                .compact();
        return token;
    }

    /**
     * 验证/解析 token
     *
     * @param token 生成的令牌
     * @return payload中的用户信息
     */
    public static JSONObject verifyToken(String token) {
        //1、构建Jwt的解析对象
        //2、指定数字签名
        //3、指定被签名后的token
        //TODO 待优化：token失效或token字符串不合法-->处理
        JwtParser parser = Jwts.parser()
                .verifyWith(Keys.hmacShaKeyFor(SIG.getBytes()))
                .build();
        Claims payload = parser.parseSignedClaims(token).getPayload();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("username", payload.get("username"));
        jsonObject.put("password", payload.get("password"));
        return jsonObject;
    }


}
